package com.quan.wx.web.biz.controller.oauth;

import java.io.IOException;
import java.net.URLEncoder;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.quan.base.common.base.web.support.controller.BaseController;
import com.quan.weixin.WeixinConstant;
import com.quan.weixin.api.API;
import com.quan.weixin.api.OAuthAccessToken;
import com.quan.weixin.common.WeixinContext;
import com.quan.weixin.common.WeixinUtil;
import com.quan.weixin.model.OAuthUser;
import com.quan.weixin.model.UserDetail;
import com.quan.weixin.tools.WeiXinTools;

@RestController
@RequestMapping(value = "/wx/oauth")
public class WeixinOAuthController extends BaseController {

	/**
	 * 静默授权
	 * @param state 用户携带的参数（可以是一个业务页面的URL地址）
	 */
	@GetMapping(value = "/oauth_process_base")
	public void oAuthProcessBase(String state) {
		//用户携带的参数
		if(!StringUtils.isNotBlank(state)) {
			state = "STATE" ;
		}
		
		//第一步：用户同意授权，获取code
		String callbackUrl = "http://yhaoquan.imwork.net/wx/oauth_callback_base" ;
		String getCodeUrl = API.get(API.OAUTH_CODE_URL, WeixinConstant.APPID, callbackUrl, "snsapi_base", state) ;
		
		try {
			this.response.sendRedirect(getCodeUrl);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 静默授权回调处理方法
	 * @return
	 */
	@GetMapping(value = "/oauth_callback_base")
	public void OAuthCallbackBase() {
		logger.debug("微信静默授权回调处理...");
		
		//接收微信传回的code参数
		String code = request.getParameter("code") ;
		//接收用户从微信客户端传来的参数（比如用户传的是一个业务URL页面地址，处理完以下业务后直接跳转到该业务URL地址）
		String state = request.getParameter("state") ;
		
		//第二步：通过code换取网页授权access_token
		String getAccessTokenUrl = API.get(API.OAUTH_CODE_ACCESS_TOKEN_URL, WeixinConstant.APPID, WeixinConstant.APPSECRET, code) ;
		OAuthAccessToken oAuthAccessToken = WeixinUtil.doGet(getAccessTokenUrl).asBean(OAuthAccessToken.class) ;
		
		UserDetail userDetail = WeiXinTools.getUserDetail(WeixinContext.getAccessToken(), oAuthAccessToken.getOpenid()) ;
		logger.debug("静默授权方式获取用户详细信息：{}", userDetail);
		
		//返回业务页面，返回的业务页面通过客户端传参的方式指定
		try {
			this.response.sendRedirect(state);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 网页授权，获取用户详细信息，需要用户授权
	 * @param state
	 */
	@GetMapping(value = "/oauth_process_userinfo")
	public void oAuthProcessUserInfo(String state) {
		//用户携带的参数
		if(!StringUtils.isNotBlank(state)) {
			state = "STATE" ;
		}
		
		try {
			//第一步：用户同意授权，获取code
			String callbackUrl = "http://yhaoquan.imwork.net/wx/oauth_callback_userinfo" ;
			String getCodeUrl = API.get(API.OAUTH_CODE_URL, WeixinConstant.APPID, URLEncoder.encode(callbackUrl, "utf-8"), "snsapi_userinfo", state) ;
		
			this.response.sendRedirect(getCodeUrl);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 静默授权回调处理方法
	 * @return
	 */
	@GetMapping(value = "/oauth_callback_userinfo")
	public void OAuthCallbackUserInfo() {
		logger.debug("微信网页授权回调处理...");
		
		//接收微信传回的code参数
		String code = request.getParameter("code") ;
		//接收用户从微信客户端传来的参数（比如用户传的是一个业务URL页面地址，处理完以下业务后直接跳转到该业务URL地址）
		String state = request.getParameter("state") ;
		
		//第二步：通过code换取网页授权access_token
		String getAccessTokenUrl = API.get(API.OAUTH_CODE_ACCESS_TOKEN_URL, WeixinConstant.APPID, WeixinConstant.APPSECRET, code) ;
		OAuthAccessToken oAuthAccessToken = WeixinUtil.doGet(getAccessTokenUrl).asBean(OAuthAccessToken.class) ;
		
		//以下做业务逻辑处理
		String userinfoUrl = API.get(API.OAUTH_GET_USER_INFO_URL, oAuthAccessToken.getAccess_token(), oAuthAccessToken.getOpenid()) ;
		OAuthUser oAuthUser = WeixinUtil.doGet(userinfoUrl).asBean(OAuthUser.class) ;
		logger.debug("网页授权方式获取用户详细信息：{}", oAuthUser);
		logger.debug("回调的业务页面URL：{}", state);
		
		//返回业务页面，返回的业务页面通过客户端传参的方式指定
		try {
			this.response.sendRedirect(state);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
